package e_stream;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;


public class TextEditor extends JFrame {

	private JPanel contentPane;
	private String fileName = "none";
	private String fileDesc = "txt";
	private JTextArea textArea;
	private boolean modifyFlag = false; // false=수정안함. true=수정됨
	
	private JToolBar tbar = new JToolBar();
	private JButton newTool = new JButton();
	private JButton openTool = new JButton();
	private JButton saveTool = new JButton();
	

	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TextEditor frame = new TextEditor();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TextEditor() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 650, 600);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnFile = new JMenu("File");
		menuBar.add(mnFile);
		
		// 새글 메뉴
		JMenuItem newItem = new JMenuItem("\uC0C8\uAE00");
		newItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				newFile();
			}
		});
		mnFile.add(newItem);
		
		// 열기메뉴
		JMenuItem openItem = new JMenuItem("\uC77D\uAE30");
		openItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				readFile();
			}
		});
		mnFile.add(openItem);
		
		JMenuItem saveItem = new JMenuItem("\uC800\uC7A5");
		saveItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				saveFile();
			}
		});
		mnFile.add(saveItem);
		
		JMenuItem saveAsItem = new JMenuItem("\uC0C8\uC774\uB984\uC73C\uB85C");
		saveAsItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				saveFileAs();
				saveFile();
			}
		});
		mnFile.add(saveAsItem);
		
		JMenuItem exitItem = new JMenuItem("\uC885\uB8CC");
		exitItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		mnFile.add(exitItem);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JScrollPane scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		textArea = new JTextArea();
		textArea.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if(modifyFlag == false){
					setTitle(fileName + " (*) ");
					modifyFlag = true;
				}
				
			}
		});
		
		// 툴바를 생성하여 추가하는 부분
		// 버튼에 아이콘 추가하기
		newTool.setIcon(new ImageIcon("./src/e_stream/newfile.png"));
		newTool.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				newFile();
			}
		});
		
		openTool.setIcon(new ImageIcon("./src/e_stream/openfile.png"));
		openTool.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				readFile();
			}
		});
		
		saveTool.setIcon(new ImageIcon("./src/e_stream/savefile.png"));
		saveTool.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				saveFile();
			}
		});

		// 툴바에 버튼추가
		tbar.add(newTool);
		tbar.add(openTool);
		tbar.add(saveTool);
		
		
		// 툴바를 contentPane에 추가
		contentPane.add(tbar, BorderLayout.NORTH);
		
		scrollPane.setViewportView(textArea);
	}
	
	public void newFile(){
		if(modifyFlag) {
			int r = JOptionPane.showConfirmDialog(
						TextEditor.this,
						"파일이 수정됨. 저장  ???",
						"파일 저장 유무 판단",
						JOptionPane.YES_NO_CANCEL_OPTION
					);
			if(r == JOptionPane.YES_OPTION){
				saveFile();
			}else if( r == JOptionPane.CANCEL_OPTION){
				return ;
			}
			
		}
		// 파일 내용이 수정되지 않은경우
		modifyFlag = false;
		fileName = "none";
		textArea.setText("");
		setTitle("file Name :" + fileName);

	}
	
	
	public void readFile(){
		int yn = 0; 
		// 파일의 편집 여부를 판단
		if(modifyFlag){
			int r = JOptionPane.showConfirmDialog(
					TextEditor.this,
					"파일이 수정됨. 저장  ???",
					"파일 저장 유무 판단",
					JOptionPane.YES_NO_CANCEL_OPTION
				);
			if(r == JOptionPane.YES_OPTION){
				saveFile();
			}else if( r == JOptionPane.CANCEL_OPTION){
				return ;
			}
		}
		
		
		
		textArea.setText("");// 초기화
		
		JFileChooser fc =new JFileChooser();
		fc.addChoosableFileFilter(
				new MyFilter("html","웹파일"));
		fc.addChoosableFileFilter(
				new MyFilter("java", "자바파일"));
		fc.setFileFilter(
				new MyFilter("txt", "텍스트파일"));
		
		yn = fc.showOpenDialog(this);
		if(yn == fc.CANCEL_OPTION) return;
		fileName = fc.getSelectedFile().toString();
		
		
		setTitle("file name : " + fileName);
		modifyFlag = false;
		try{
			FileReader fr = new FileReader(fileName);
			BufferedReader br = new BufferedReader(fr);
			String temp = "";
			while((temp = br.readLine()) != null){
				textArea.append(temp);
				textArea.append("\n");
			}
			
		}catch(Exception ex){ ex.printStackTrace();}
	}
	
	// 새이름으로 저장하려 할때
	// showSaveDialog()을 사용하여 저장할 파일명을
	// 가져온 다음 saveFile()을 호출하여 
	// textArea의 내용을 저장함.
	public void saveFileAs(){
		JFileChooser fc = new JFileChooser();
		fc.addChoosableFileFilter(
				new MyFilter("html","웹파일"));
		fc.addChoosableFileFilter(
				new MyFilter("java", "자바파일"));
		fc.setFileFilter(
				new MyFilter("txt", "텍스트파일"));
		int yn = fc.showSaveDialog(this);
		
		if(yn == JFileChooser.APPROVE_OPTION){
			fileName = fc.getSelectedFile().toString();
			fileDesc = ((MyFilter)fc.getFileFilter()).getType();// 파일 확장자
			if(!fileName.endsWith(fileDesc)) fileName += fileDesc;
		}else{
			
			fileName = "none";
		}
		
		this.setTitle(fileName);

	}
	// 기존이름으로 저장하려 할때
	// 지정된 파일명이 있는 경우 그냥 저장하고
	// 지정된 파일명이 없는 경우 saveFileAs()를 
	// 호출하여 파일명을 지정한후 저장.
	public void saveFile(){
		FileWriter fw = null;
		BufferedWriter buffer = null;
		if( fileName.equals("none")) saveFileAs();
		if(fileName.equals("none")) {
			JOptionPane.showMessageDialog(this, 
					"파일명이 지정되어 있지않아 저장되지 않았습니다.", 
					"파일저장 오류",
					JOptionPane.ERROR_MESSAGE);
		}
		
		try	{
			fw = new FileWriter(fileName);
			buffer = new BufferedWriter(fw);

			String str = textArea.getText();
			buffer.write(str,0,str.length());			

			setTitle(fileName);
			modifyFlag = false;


		}catch(Exception ex){
			
		}finally{
			try{
				buffer.close();
				fw.close();
			}catch (Exception e) {}
		}
	}
	// 작업을 종료하려 할때
	// 종료 메뉴나 윈도우창을 닫으려 할때 호출
	// modifyFlag가 참인 경우 저장 여부를 묻고 처리.
	public void fileExit(){
		if(modifyFlag){
			int yn = JOptionPane.showConfirmDialog(this, 
					"파일이 수정되었습니다. 저장하쇼 !!!",
					"수정된 파일 저장",
					JOptionPane.YES_NO_CANCEL_OPTION
					);
			if(yn == JOptionPane.OK_OPTION){
				saveFile();
				System.exit(0);		
			}else if(yn == JOptionPane.NO_OPTION){
				System.exit(0);
			}

		}
		
		
	}
	

}







